﻿#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#Python提供了切片（Slice）操作符
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
print(L[0:3])
print(L[:3])
L = list(range(100))
print(L[:10])
print(L[-10:])
print(L[::10])
#tuple也是一种list，唯一区别是tuple不可变。因此，tuple也可以用切片操作，只是操作的结果仍是tuple
print((0, 1, 2, 3, 4, 5)[:3])
#字符串'xxx'也可以看成是一种list，每个元素就是一个字符。因此，字符串也可以用切片操作，只是操作结果仍是字符串
print('ABCDEFG'[:3])

#Python的for循环抽象程度要高于C的for循环，因为Python的for循环不仅可以用在list或tuple上，还可以作用在其他可迭代对象上
#只要是可迭代对象，无论有无下标，都可以迭代，比如dict就可以迭代
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
    print(key)
#默认情况下，dict迭代的是key。如果要迭代value，可以用for value in d.values()，如果要同时迭代key和value，可以用for k, v in d.items()
#由于字符串也是可迭代对象，因此，也可以作用于for循环
for ch in 'ABC':
    print(ch)
from collections import Iterable
print(isinstance('abc', Iterable))
#Python内置的enumerate函数可以把一个list变成索引-元素对，这样就可以在for循环中同时迭代索引和元素本身
for i, value in enumerate(['A', 'B', 'C']):
    print(i, value)


#Python内置的非常简单却强大的可以用来创建list的生成式
print(list(range(1,11)))
print([x * x for x in range(1,11)  if x % 2 == 0])
#还可以使用两层循环，可以生成全排列
print([m + n for m in 'ABC' for n in 'XYZ'])
#列出当前目录下的所有文件和目录名，可以通过一行代码实现
import os
print([d for d in os.listdir('.')])


#要创建一个generator，有很多种方法。第一种方法很简单，只要把一个列表生成式的[]改成()，就创建了一个generator
g = (x * x for x in range(10))
print(next(g))

#这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字，那么这个函数就不再是一个普通函数，而是一个generator
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
#但是用for循环调用generator时，发现拿不到generator的return语句的返回值。如果想要拿到返回值，必须捕获StopIteration错误，返回值包含在StopIteration的value中
g = fib(6)
while True:
    try:
        x = next(g)
        print('g:', x)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break

#可以被next()函数调用并不断返回下一个值的对象称为迭代器：Iterator
#这些可以直接作用于for循环的对象统称为可迭代对象：Iterable
from collections import Iterator
print(isinstance((x for x in range(10)), Iterator))
print(isinstance([], Iterator))
print(isinstance('abc', Iterator))
#把list、dict、str等Iterable变成Iterator可以使用iter()函数















